// 解题思路：
// 本题目需要找到能够满足最多人数的温度，输出能够满足的人数
// 可以采用枚举温度的方式，看看哪个温度能够满足最多人的需要求，并统计人数
// 枚举每一个温度后，需要看看有多少人的需求被满足了，找人数的时候可以使用二分优化
// 使用二分之前先对数组进行排序，排完序之后，再二分查找满足人数区间的左端点和右端点
// 找到左右端点之后再计算满足的人数 count = right - left + 1

// 使用二分查找的关键细节：需要搞清楚移动 left 还是 right
// 找左端点：需要移动 left
// 如果 arr[mid] < cur - p, 需要移动左端点 left = mid + 1
// 如果 arr[mid] >= cur - p, 需要移动右端点 right = mid

// 找右端点：需要移动 right
// 如果 arr[mid] > cur + p, 需要移动右端点 right = mid - 1
// 如果 arr[mid] <= cur + p, 需要移动左端点 left = mid

// 还需要注意：
// 如果是 right = mid - 1，从右往左移，找中点 mid 的时候就要找右中点 mid = (right - left + 1) / 2 + left
// 如果是 left = mid + 1, 从左往右移，找中点 mid 就需要找左中点 mid = (right - left) / 2 + left

// 这道题除了用枚举 + 二分的方式，还可以用滑动窗口的方式
// 首先肯定存在一个温度值，是符合要求的，但是这个温度值可以不用管，因为题目没要求输出温度值，只要求输出人数
// 但是需要确保的是人员需要的温度最大值和最小值之间不超过 2*p，超过 2p，就不能同时满足了
// 因此可以先将数组排序，在考虑使用滑动窗口的思路求解
// max - min <= 2 * p就是窗口，超出窗口就将左边的元素出窗口，即 left++
// 否则可以统计人数：ret = Math.max(ret, right - left + 1)
// 最后返回最大值即可

import java.util.*;
import java.io.*;

public class AirConditionOnOff {
    public static Read in = new Read();
    public static void main(String[] args) throws IOException{
        int n = in.nextInt();
        int p = in.nextInt();

        int[] arr = new int[n];
        for(int i = 0; i < n; i++) arr[i] = in.nextInt();

        Arrays.sort(arr);
        // 枚举 + 二分
        int l = 0; int r = 0;
        int left = 0; int right = n - 1; int mid = 0;
        int ret = 0;
        for(int i : arr){
            // 找左端点，基准左边的值移动 left
            left = 0; right = n - 1;
            while(left < right){
                mid = (right - left) / 2 + left;
                if(arr[mid] < i - p){
                    left = mid + 1;
                }else{
                    right = mid;
                }
            }
            l = left;
            // 找右端点，基准右边的值移动 right
            left = 0; right = n - 1;
            while(left < right){
                mid = (right - left + 1) / 2 + left;
                if(arr[mid] > i + p){
                    right = mid - 1;
                }else{
                    left = mid;
                }
            }
            r = right;
            ret = Math.max(ret, r - l + 1);
        }
        System.out.println(ret);

        // 滑动窗口
        ret = 0; left = 0; right = 0;
        int window = 2 * p;
        while(right < n){
            while(arr[right] - arr[left] > window){
                left++;
            }
            ret = Math.max(ret, right - left + 1);
            right++;
        }
        System.out.println(ret);
    }
}

class Read{
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

    String next() throws IOException{
        while(!st.hasMoreTokens()){
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    int nextInt() throws IOException{
        return Integer.parseInt(next());
    }
}
